package com.yangwei.examination.utils;

import org.apache.commons.lang3.StringUtils;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.io.CsvBeanWriter;
import org.supercsv.io.ICsvBeanWriter;
import org.supercsv.prefs.CsvPreference;

import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.List;

//导出工具类
public class ReportCsvUtils {
    /**
     * 导出数据列表为CSV文件（不带列格式处理器）
     *
     * @param response    HTTP响应对象
     * @param header      CSV文件的列头信息
     * @param properties  对应列头的属性名数组
     * @param fileName    导出文件名（不包含扩展名，默认为1.csv）
     * @param sourceList  数据列表
     * @throws Exception 异常
     */
    public static void reportList(
            HttpServletResponse response,
            String[] header,
            String[] properties,
            String fileName,
            List<?> sourceList) throws Exception {
        // 判断参数是否合法
        if (header == null || properties == null || sourceList == null ||
                header.length <= 0 || properties.length <= 0 || sourceList.size() <= 0) {
            return;
        }
        // 设置默认文件名
        if (StringUtils.isBlank(fileName)) {
            fileName = "1.csv";
        }
        // 设置响应头信息
        response.setContentType("application/csv");
        response.setCharacterEncoding("GBK");
        response.setHeader("Content-FileName", URLEncoder.encode(fileName, "UTF-8"));
        response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");
        // 创建CSV写入器，使用标准偏好设置
        ICsvBeanWriter csvWriter = new CsvBeanWriter(response.getWriter(), CsvPreference.STANDARD_PREFERENCE);
        // 写入列头
        csvWriter.writeHeader(header);
        // 写入数据行
        for (Object obj : sourceList) {
            csvWriter.write(obj, properties);
        }
        // 关闭写入器
        csvWriter.close();
    }

    /**
     * 导出数据列表为CSV文件（带列格式处理器）
     * @param response    HTTP响应对象
     * @param header      CSV文件的列头信息
     * @param properties  对应列头的属性名数组
     * @param fileName    导出文件名（不包含扩展名，默认为1.csv）
     * @param sourceList  数据列表
     * @param processors  列格式处理器数组，用于对特定列进行处理
     * @throws Exception 异常
     */
    public static void reportListCsv(
            HttpServletResponse response, // HTTP响应对象
            String[] header, // CSV文件的表头
            String[] properties, // 对象属性对应的字段
            String fileName, // 文件名
            List<?> sourceList, // 数据列表
            CellProcessor[] processors // 单元格处理器数组
    ) throws Exception {
        // 判断参数是否合法
        if (header == null || properties == null || sourceList == null ||
                header.length <= 0 || properties.length <= 0 || sourceList.size() <= 0) {
            return;
        }
        // 如果文件名为空，则默认为"1.csv"
        if (StringUtils.isBlank(fileName)) {
            fileName = "1.csv";
        }
        // 设置响应内容类型为CSV文件
        response.setContentType("application/csv");
        response.setCharacterEncoding("GBK");
        // 设置响应头，指定文件名并进行URL编码
        response.setHeader("Content-FileName", URLEncoder.encode(fileName, "UTF-8"));
        response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");

        // 创建CsvBeanWriter对象，用于写入CSV文件
        ICsvBeanWriter csvWriter = new CsvBeanWriter(response.getWriter(), CsvPreference.STANDARD_PREFERENCE);
        // 写入表头
        csvWriter.writeHeader(header);
        // 遍历数据列表，依次写入数据;
        for (Object obj : sourceList) {
            csvWriter.write(obj, properties, processors);
        }
        // 关闭CsvBeanWriter
        csvWriter.close();
    }
}
